/**
 * @project_name thread
 * @package_name com.gxwz.thread
 * @file_name Java5SpecificCyclicBarrierClass4Thread.java
 */
package com.gxwz.thread;

import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


/**
 * CyclicBarrier 类
 * 作用： 当有三个线程共同执行一个任务，
 * 当大家都执行完这个任务的时候我们才接着往下执行
 * 这时候就用到CyclicBarrier类了。
 * @author chendequan
 * @email 1527254027@qq.com
 * @datetime 2013-9-6 下午01:36:22
 * 
 */
public class Java5SpecificCyclicBarrierClass4Thread {
	public static void main(String[] args) {
		ExecutorService service = Executors.newCachedThreadPool();
//		创建包含3个线程的CyclicBarrier对象
		final CyclicBarrier cb = new CyclicBarrier(3);
		
		for (int i = 0; i < 3; i++) {
			Runnable runnable = new Runnable() {
				/* (non-Javadoc)
				 * @see java.lang.Runnable#run()
				 */
				@Override
				public void run() {
					try {
						System.out.println("begin now!!");
//						有一个线程等待结果为0；既得到的结果为实际数减1
						System.out.println(cb.getNumberWaiting());
						
						if (cb.getNumberWaiting() != 0) 
							cb.wait();
						
						System.out.println("end once!!");
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			};
//			在未来某个时间执行给定的命令。
//			该命令可能在新的线程、已入池的线程或者正调用的线程中执行，
//			这由 Executor 实现决定。
//			参数是可运行的任务
			service.execute(runnable);
		}
//		启动一次顺序关闭，执行以前提交的任务，但不接受新任务
		service.shutdown();
	}
}

//java.lang.IllegalMonitorStateException
//违法的监控状态异常。
//当某个线程试图等待一个自己并不拥有的对象（O）的监控器或者
//通知其他线程等待该对象（O）的监控器时，抛出该异常。
